//package com.cloud.annex.service;
//
//import cn.hutool.core.util.ZipUtil;
//import com.aliyun.oss.OSS;
//import com.aliyun.oss.model.CreateBucketRequest;
//import com.cloud.common.domain.Result;
//import com.cloud.common.utils.ImageUtils;
//import com.cloud.annex.AnnexConfiguration;
//import com.cloud.exception.CommonException;
//import com.cloud.utils.ToolUtils;
//import com.cloud.utils.ServletUtils;
//import jakarta.annotation.Resource;
//import jakarta.servlet.http.HttpServletResponse;
//import org.apache.commons.lang3.StringUtils;
//import org.springframework.beans.factory.annotation.Autowired;
//import org.springframework.beans.factory.annotation.Value;
//import org.springframework.stereotype.Component;
//import org.springframework.web.multipart.MultipartFile;
//
//import javax.imageio.ImageIO;
//import java.io.InputStream;
//import java.io.OutputStream;
//import java.net.URLEncoder;
//import java.util.ArrayList;
//import java.util.HashMap;
//import java.util.List;
//import java.util.Map;
//
///**
// * 阿里云oss文件存储服务
// *
// * @author yzj
// */
//@Component
//public class OssService {
//
//    @Resource
//    private OSS ossClient;
//
//    @Autowired
//    private AnnexConfiguration annexConfiguration;
//
//    @Value("${oss.endPoint}")
//    private String endPoint;
//
//    /**
//     * 文件上传返回访问URL
//     *
//     * @param bucketName 存储桶
//     * @param groupName  存储分组名称
//     * @param file
//     * @return
//     */
//    public Map<String, Object> saveUploadAnnex(String bucketName, String groupName, MultipartFile file) {
//        Map<String, Object> mapAnnex = new HashMap<>();
//        try {
//            StringBuffer fileName = new StringBuffer();
//            String oldName = file.getOriginalFilename();
//            String suffix = oldName.substring(oldName.lastIndexOf("."));
//            String timePrefix = ToolUtils.getDataUrlFormat();
//            if (StringUtils.isNotEmpty(groupName)) {
//                fileName.append(groupName).append("/");
//            }
//            fileName.append(timePrefix).append("/").append(ToolUtils.getUuid()).append(suffix);
//            // 保存文件到OSS文件服务中
//            ossClient.putObject(bucketName, fileName.toString(), file.getInputStream());
//            mapAnnex.put("url", "https://" + bucketName + "." + endPoint + "/" + fileName.toString());
//            mapAnnex.put("name", fileName);
//            mapAnnex.put("suffix", suffix);
//        } catch (Exception e) {
//            e.printStackTrace();
//        } finally {
//            if (ossClient != null) {
//                // 关闭OSSClient链接
//                ossClient.shutdown();
//            }
//        }
//        return mapAnnex;
//    }
//
//    /**
//     * 图像上传压缩文件大小并返回访问URL
//     *
//     * @param bucketName 存储桶
//     * @param groupName  存储分组名称
//     * @param file
//     */
//    public Map<String, Object> zipImage(String bucketName, String groupName, MultipartFile file) {
//        Map<String, Object> mapAnnex = new HashMap<>();
//        try {
//            StringBuffer fileName = new StringBuffer();
//            String oldName = file.getOriginalFilename();
//            String suffix = oldName.substring(oldName.lastIndexOf("."));
//            String timePrefix = ToolUtils.getDataUrlFormat();
//            if (StringUtils.isNotEmpty(groupName)) {
//                fileName.append(groupName).append("/");
//            }
//            fileName.append(timePrefix).append("/").append(ToolUtils.getUuid()).append(suffix);
//            InputStream inputStream = ImageUtils.getInputStream(ImageUtils.compress(ImageUtils.compress(ImageIO
//                    .read(file.getInputStream()))), ImageUtils.getFileExtention(file.getOriginalFilename()));
//            // 通过InputStream 上传图片对象信息
//            ossClient.putObject(bucketName, fileName.toString(), inputStream);
//            mapAnnex.put("url", "https://" + bucketName + "." + endPoint + "/" + fileName.toString());
//            mapAnnex.put("name", fileName);
//            mapAnnex.put("suffix", suffix);
//        } catch (Exception e) {
//            e.printStackTrace();
//        } finally {
//            if (ossClient != null) {
//                // 关闭OSSClient链接
//                ossClient.shutdown();
//            }
//        }
//        return mapAnnex;
//    }
//
//    /**
//     * 单文件上传
//     *
//     * @param groupName 存储分组名称
//     * @param file
//     * @return
//     */
//    public Result upload(String groupName, MultipartFile file) {
//        String bucketName = annexConfiguration.getBucketName();
//        // 判断存储桶是否存在
//        if (ossClient.doesBucketExist(bucketName)) {
//            return Result.success("操作成功", saveUploadAnnex(bucketName, groupName, file));
//        } else {
//            return Result.message(CommonException.BUCKET_NO_EXITS.getCode(), CommonException.BUCKET_NO_EXITS.getMsg());
//        }
//    }
//
//    /**
//     * 多文件上传
//     *
//     * @param groupName 存储分组名称
//     * @param file
//     * @return
//     */
//    public Result moreUpload(String groupName, List<MultipartFile> file) {
//        List<Map<String, Object>> list = new ArrayList<>();
//        String bucketName = annexConfiguration.getBucketName();
//        if (ossClient.doesBucketExist(bucketName)) {
//            file.forEach((var) -> {
//                list.add(saveUploadAnnex(bucketName, groupName, var));
//            });
//        } else {
//            return Result.message(CommonException.BUCKET_NO_EXITS.getCode(), CommonException.BUCKET_NO_EXITS.getMsg());
//        }
//        if (list.size() > 0) {
//            return Result.success("操作成功", list);
//        } else {
//            return Result.error("操作失败：请重新上传");
//        }
//    }
//
//    /**
//     * 图片压缩上传
//     *
//     * @param groupName 存储分组名称
//     * @param file
//     * @return
//     */
//    public Result imgZipUpload(String groupName, MultipartFile file) {
//        String bucketName = annexConfiguration.getBucketName();
//        if (ossClient.doesBucketExist(bucketName)) {
//            return Result.success("操作成功", zipImage(bucketName, groupName, file));
//        } else {
//            return Result.message(CommonException.BUCKET_NO_EXITS.getCode(), CommonException.BUCKET_NO_EXITS.getMsg());
//        }
//    }
//
//    /**
//     * 文件下载
//     *
//     * @param bucketName 存储桶名称
//     * @param fileName   上传文件名称
//     * @param response
//     */
//    private void downloadFile(String bucketName, String fileName, HttpServletResponse response) {
//        try {
//            InputStream file = ossClient.getObject(bucketName, fileName).getObjectContent();
//            response.setCharacterEncoding("UTF-8");
//            response.setHeader("Access-Control-Expose-Headers", "Content-Disposition");
//            response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(fileName, "UTF-8"));
//            OutputStream outputStream = response.getOutputStream();
//            ServletUtils.writeIO(file, outputStream);
//        } catch (Exception e) {
//            e.printStackTrace();
//        }
//    }
//
//    /**
//     * 多文件下载
//     *
//     * @param bucketName 存储桶名称
//     * @param zipName    文件压缩后名称
//     * @param urlList    上传文件名称集合
//     * @param response
//     */
//    private void downloadFiles(String bucketName, String zipName, List<String> urlList, HttpServletResponse response) {
//        try {
//            InputStream[] files = new InputStream[urlList.size()];
//            // 被压缩文件名称
//            String[] srcFileNames = new String[urlList.size()];
//            for (int i = 0; i < urlList.size(); i++) {
//                String fileUrl = urlList.get(i);
//                InputStream inputStream = ossClient.getObject(bucketName, fileUrl).getObjectContent();
//                if (inputStream == null) {
//                    continue;
//                }
//                files[i] = inputStream;
//                String[] splitFileUrl = fileUrl.split("/");
//                srcFileNames[i] = splitFileUrl[splitFileUrl.length - 1];
//            }
//            response.setCharacterEncoding("UTF-8");
//            response.setHeader("Access-Control-Expose-Headers", "Content-Disposition");
//            response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(zipName + ".zip", "UTF-8"));
//            //多个文件压缩成压缩包返回
//            ZipUtil.zip(response.getOutputStream(), srcFileNames, files);
//        } catch (Exception e) {
//            e.printStackTrace();
//        }
//    }
//
//    /**
//     * 文件下载
//     *
//     * @param fileName 上传文件名称
//     * @return
//     */
//    public Result download(String fileName) {
//        HttpServletResponse response = ServletUtils.getResponse();
//        String bucketName = annexConfiguration.getBucketName();
//        if (ossClient.doesBucketExist(bucketName)) {
//            downloadFile(bucketName, fileName, response);
//        } else {
//            return Result.message(CommonException.BUCKET_NO_EXITS.getCode(), CommonException.BUCKET_NO_EXITS.getMsg());
//        }
//        return Result.success("操作成功");
//    }
//
//    /**
//     * 多文件下载
//     *
//     * @param zipName 文件压缩后的名称
//     * @param urlList 上传文件名称集合
//     * @return
//     */
//    public Result moreDownload(String zipName, List<String> urlList) {
//        HttpServletResponse response = ServletUtils.getResponse();
//        String bucketName = annexConfiguration.getBucketName();
//        if (ossClient.doesBucketExist(bucketName)) {
//            downloadFiles(bucketName, zipName, urlList, response);
//        } else {
//            return Result.message(CommonException.BUCKET_NO_EXITS.getCode(), CommonException.BUCKET_NO_EXITS.getMsg());
//        }
//        return Result.success("操作成功");
//    }
//
//    /**
//     * 文件删除
//     *
//     * @param fileName 上传文件名称
//     * @return
//     */
//    public Result remove(String fileName) {
//        try {
//            String bucketName = annexConfiguration.getBucketName();
//            if (ossClient.doesBucketExist(bucketName)) {
//                ossClient.deleteObject(bucketName, fileName);
//                return Result.success("操作成功");
//            } else {
//                return Result.message(CommonException.BUCKET_NO_EXITS.getCode(), CommonException.BUCKET_NO_EXITS.getMsg());
//            }
//        } catch (Exception e) {
//            return Result.error("操作失败:" + e);
//        } finally {
//            if (ossClient != null) {
//                // 关闭OSSClient链接
//                ossClient.shutdown();
//            }
//        }
//    }
//
//    /**
//     * OSS 创建存储桶
//     *
//     * @param bucketName 存储桶
//     * @return
//     */
//    public Result addBucket(String bucketName) {
//        try {
//            // 创建CreateBucketRequest对象。
//            CreateBucketRequest createBucketRequest = new CreateBucketRequest(bucketName);
//            // 此处以设置存储空间的存储类型为标准存储为例介绍。
//            //createBucketRequest.setStorageClass(StorageClass.Standard);
//            // 数据容灾类型默认为本地冗余存储，即DataRedundancyType.LRS。
//            // 如果需要设置数据容灾类型为同城冗余存储，请设置为DataRedundancyType.ZRS。
//            //createBucketRequest.setDataRedundancyType(DataRedundancyType.ZRS);
//            // 设置存储空间的权限为公共读，默认为私有。
//            //createBucketRequest.setCannedACL(CannedAccessControlList.PublicRead);
//            ossClient.createBucket(createBucketRequest);
//            return Result.success("操作成功");
//        } catch (Exception e) {
//            return Result.error("操作失败:" + e);
//        } finally {
//            if (ossClient != null) {
//                ossClient.shutdown();
//            }
//        }
//    }
//
//    /**
//     * Feign调用（查询上传附件路径）
//     *
//     * @param fileName 上传文件名称
//     * @return
//     */
//    public Result getInAnnexUrl(String fileName) {
//        String bucketName = annexConfiguration.getBucketName();
//        String url = "https://" + bucketName + "." + endPoint + "/" + fileName;
//        return Result.success("查询成功", url);
//    }
//
//}
